home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
IRIX Base Documentation 1998 November
/
IRIX 6.5.2 Base Documentation November 1998.img
/
usr
/
relnotes
/
compiler_dev
/
ch4.z
/
ch4
Wrap
Text File
|
1998-11-02
|
19KB
|
528 lines
- 1 -
Base Development 7.2.1 Release Notes
- 2 -
DDDDooooccccuuuummmmeeeennnntttt NNNNuuuummmmbbbbeeeerrrr 000000008888----1111777788882222----000033330000
4. _K_n_o_w_n__P_r_o_b_l_e_m_s__a_n_d__W_o_r_k_a_r_o_u_n_d_s
4.0.1 _M_I_P_S_p_r_o__C_o_m_p_i_l_e_r_s
+o The MIPSpro C compiler requires adherence to
the ANSI C requirement (3.3.2.2) which states
that calls to varargs routines must have a
prototype visible at the call and the
function definition (if they pass floating
point actual arguments), and must use the
_s_t_d_a_r_g._h (ANSI C section 4.8) interface. The
compiler will issue a warning if it sees
floating point parameters passed to _p_r_i_n_t_f,
_s_p_r_i_n_t_f, or _f_p_r_i_n_t_f without a prototype. _l_d
will issue a warning if possible when
floating point parameters are passed to
varargs routines without prototypes visible
at the call site. However, _l_d cannot issue
such warnings if the call is via a function
pointer to an anonymous function.
SGI-provided library functions like _p_r_i_n_t_f
all use prototype-style declarations in the
system header files (i.e. <stdio.h>), so
simply including the relevant header files in
files which call them satisfies this
requirement. User-written code should use the
same practice.
+o The 64-bit subprogram call interface passes
all parameters in 64-bit containers. The
first eight are passed in registers, sign-
extending integers smaller than 64 bits to
64-bits. Beyond the first eight, parameters
smaller than 64-bits (except structs) are
passed right justified in the 64-bit
container in memory. Therefore, passing an
int (32-bit) parameter and referencing it in
the callee as a long or pointer (64-bit) may
pick up extraneous garbage in the high-order
half of the value. Use of prototypes will
solve this problem by automatically
converting the passed value; otherwise, the
normal C rules for correspondence between
actual and formal parameters must be
followed. An important potential cause of
- 3 -
this problem is defining "_N_U_L_L" as "0" and
then passing it as an unprototyped pointer
parameter. To avoid this, define "_N_U_L_L" as
"0L" or "(void *)0".
+o There are a number of similar issues which
arise in porting C code to the 64-bit
programming model. See the _M_I_P_S_p_r_o _6_4-_b_i_t
_P_o_r_t_i_n_g _a_n_d _T_r_a_n_s_i_t_i_o_n _G_u_i_d_e for more
information.
+o The software pipelining statistics that are
generated when compilations are performed
with the -_O_3 -_S -_r_5_0_0_0 flags are overly
conservative in calculating peak performance
of the R5000. As a result, software
pipelining reports such as the one below can
indicate values over 100% of peak performance
for this processor. For example:
#<swps> 100 estimated iterations before pipelining
#<swps> Not unrolled before pipelining
#<swps> 32 cycles per iteration
#<swps> 64 flops (196% of peak) (madds count as 2)
#<swps> 32 flops (100% of peak) (madds count as 1)
#<swps> 32 madds (193% of peak)
#<swps> 32 fmuls (193% of peak) (madds count as 1)
#<swps> 32 fadds (100% of peak) (madds count as 1)
#<swps> 16 mem refs ( 50% of peak)
#<swps> 31 integer ops ( 96% of peak) (mem refs included)
#<swps> 63 instructions ( 98% of peak)
#<swps> 2 short trip threshold
#<swps> 21 ireg registers used.
#<swps> 24 fgr registers used.
+o A new flag has been provided for the -_O_P_T:
... group. -_O_P_T:_w_r_a_p__a_r_o_u_n_d__u_n_s_a_f_e__o_p_t=_O_F_F
will disable both the induction variable
replacement and linear function test
replacement optimizations. These
optimizations are normally enabled at general
optimization level -_O_3. The optimizations
are unsafe in that they may potentially
generate incorrect code for situations that
may arise (but are not limited to) when there
are multiple induction variables in loops and
their combined initial values can overflow or
wrap around. General use of this flag is
discouraged because it can degrade
performance. It is provided, however, as a
diagnostic tool to identify the situation
- 4 -
described above.
+o The assembly language file created by -_n_3_2
-_m_i_p_s_4 -_i_p_a -_k_e_e_p is under certain
circumstances incompatible with the
assembler.
4.0.2 _a_s
+o Use of the 32-bit assembler without the
MIPSpro C Compiler package.
The 32-bit assembler by default calls cfe to
preprocess the input assembly language file.
The cfe (C front end) program is available
only in the MIPSpro C Compiler Product. To
use the 32-bit assembler without the MIPSpro
C Compiler Product do the following:
as -32 -nocpp foo.s (when no #include files are in the .s file)
or
as -32 -oldcpp foo.s (uses /usr/lib/cpp instead of /usr/lib/cfe)
The -n32 or -64 bit assembler does not have
this restriction.
4.0.3 _l_d
+o Sometimes rld gets DSO visibility wrong and
calls to dlopen will result in an error
saying dlopen can't resolve a symbol defined
in one DSO (FOO) and then referenced in DSO
(BAR). This occurs when parts of DSO FOO are
marked as hidden with respect to some DSO's,
even if a particular symbol in FOO should be
visible to BAR. The workaround in to re-
order the loading of DSO's so that FOO is
loaded after BAR. (Bug #455035)
+o ld sometimes complains when -_u_p_d_a_t_e__r_e_g_i_s_t_r_y
or -_e_x_p_o_r_t_s are used on the link line (Bug
#375616).
- 5 -
The error messages that are being generated
in certain cases when these flags are used
are:
ld: ERROR 4: Conflicting flag setting: --update_registry
ld: ERROR 4: Conflicting flag setting: -exports
4.1 _d_b_x
+o _d_b_x cannot correctly display data values of
C++ class members that have a C++ class
offset (offset in bytes from the beginning of
the class) greater than 32767. This bug does
not apply to C structures or unions or
Fortran records: it applies only to C++
classes. The symptom is that the data values
displayed (for data that has a class offset
greater than 32767 bytes) are incorrect.
+o _l_d(1) options like -Bsymbolic and -hides and
-hidden_symbol cause ELF markings to be made
to cause _r_l_d(1) to resolve symbol references
differently than by default. These markings
are not noticed by _d_b_x. _d_b_x always resolves
externals starting with the present dso (the
current frame and scope) working outwards to
the external scope of that dso/a.out and then
proceeds sequentially thru the DSOs to find
the external. _d_b_x can therefore print an
incorrect value given an external name when
there are multiple externals with the same
name and the resolution rule _d_b_x follows at
present does not match the rules rld uses.
Use the wwwwhhhhiiiicccchhhh command to see what symbol an
external name resolves to. Use specific _d_b_x
naming using the dso module name to resolve a
name to a specific dso. For example, to
print a value errno from libc.so.1 (bypassing
the incomplete lookup rules), use the _d_b_x
command print libc.errno.
+o If _RLD_ROOT is set to pick up a different
_l_i_b_c._s_o._1, and breakpoints are set in
_l_i_b_c._s_o._1 before running the program, the
breakpoints become permanent, that is they
cannot be deleted. A workaround is to stop in
main before setting any breakpoints in
libc.so.1.
+o In single-user state, if _d_b_x core dumps on
startup, try the command sequence
- 6 -
/etc/init.d/network start
/etc/init.d/network stop
_T_h_e_n _r_e_t_r_y _d_b_x. Usually the message before
the abort will start with EEEERRRRRRRROOOORRRR:::: bbbbiiiinnnndddd ffffaaaaiiiilllleeeedddd
eeeerrrrrrrrnnnnoooo 111122226666.
+o If a store instruction updates a location
which is being tracked with a stop/when/trace
and the cpu is an R8000 and the store
instruction is in any delay slot (jump or
load) and the program is a 32-bit program,
the stop/when/trace may not be triggered and
if it is triggered may print out/use an
incorrect value.
+o On an R8000: if an interactive function call
calls a function which has anything but a
no-op (aka 'nada') in the delay slot of a
return from that function (jr ra) _d_b_x will
print <Unimplemented> and cannot print the
function's return value. The function has
been executed and any side effects happened.
Clear the incomplete 'return' with the
cccclllleeeeaaaarrrrccccaaaallllllllssss command or the rrrreeeettttuuuurrrrnnnn command.
+o It is difficult to set a breakpoint in some
relatively new kinds of C++ functions (for
example X::operator int and X::operator
new[]) The only ways are to determine the
full demangled name and enclose it in back-
quotes or to determine the full mangled name
and use that. Long accepted forms, such as
X::operator + can be named to dbx as X::+.
+o If you move a corefile and its a.out to
another machine, _d_b_x will probably warn about
mismatches with certain DSOs when you try to
use _d_b_x on the a.out and corefile. You
cannot safely copy the DSOs from the other
machine into the corresponding locations of
the new machine (i.e., /usr/lib) and if you
copy them somewhere else (for example if you
copy them into the same directory as the core
file and a.out) there is no way to tell _d_b_x
where to find them (_d_b_x does not understand
that the information in the corefile about
the dso absolute paths should be
disregarded).
- 7 -
+o If the list of DSOs (and their respective
library list as shown by eeeellllffffdddduuuummmmpppp ----DDDDllll) has a
circularity _d_b_x will keep reading the
circular set over and over forever, never
finishing. Such a circularity is improper
and ill-advised and should be removed by
changing your DSO build (the circularity will
be in your DSOs). While _d_b_x ought to catch
and warn about this, it does not in this
release (except for some simple circularities
where a dso names itself: it does catch some
very simple cases but does not issue a
warning).
+o If you set two watchpoints at the same
address, _d_b_x will correctly output an error
message when you try and set the second
watchpoint. However, if you delete the first
watchpoint, the second watchpoint will appear
even though it does not show up in any
status.
4.1.1 _L_i_b_r_a_r_i_e_s These are known problems in
compiler-associated libraries:
+o In general, routines in the ----llllmmmm44443333 library
might not conform to either SVR4 or IEEE
with respect to diagnostics or return
values. These discrepancies are, however,
described in the manual pages of the
constituent functions. (See Section 3.5 for
math library changes). The following
particular problems are known (these
problems exist in ----llllmmmm44443333 routines, but not
in ----llllmmmm routines):
- The ----llllmmmm44443333 _y_0, _y_1, and _y_n functions
produce underflow inconsistently (with
respect to ----llllmmmm).
+o The results from _v_s_i_n, _v_c_o_s and _v_t_a_n are
valid only for argument values between
(pi*2e19) and (pi*2e-19).
+o The results from _v_s_i_n_f, _v_c_o_s_f and _v_t_a_n_f are
valid only for argument values between 2e28
and 2e-28.
+o The results from _v_s_q_r_t_f and _v_s_q_r_t are not
always correctly rounded.
- 8 -
+o The mips4 versions of the following
routines do not support denormal arguments:
_v_l_o_g_f, _v_l_o_g_1_0_f, _v_l_o_g_1_0, _v_l_o_g.
All return NaN under those circumstances.
+o Because the multiply-add instructions are
rounded twice on the R10000, the Fortran
intrinsics _A_M_O_D and _D_M_O_D are less accurate
than than they are on earlier chips.